<!DOCTYPE HTML>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
    <meta name="google-site-verification" content="KEatQX-J4dYY-6J2KU_aP5X8gAJ8wS0lhylI8umX6WA" />
    <meta name="viewport" content="width=device-width,initial-scale=1,minimal-ui">
    <link rel="shortcut icon" href="../images/favicon.ico">
    <link rel="stylesheet" href="../css/code.css" type="text/css"/>
    <link rel="stylesheet" href="../css/bootstrap.css" type="text/css"/>
    <link rel="stylesheet" href="../css/main.css" type="text/css"/>
    <title>编程小梦|读书笔记——《尽在双11》</title>
</head>
<body>
<nav class="navbar navbar-default navbar-static-top" style="opacity: .9" role="navigation">
    <div class="container-fluid">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle" data-toggle="collapse"
                    data-target="#bs-example-navbar-collapse-1">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="/">编程小梦</a>
        </div>
        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
            <ul class="nav navbar-nav navbar-right">
                <li class="active"><a href="/">Blog</a></li>
                
                <li><a href="https://github.com/kangkaisen" target="_blank" rel="nofollow">GitHub</a></li>
                
                
                <li><a href="http://weibo.com/533234148" target="_blank" rel="nofollow">WeiBo</a></li>
                
            </ul>
        </div>
    </div>
</nav>
<div class="row" style="padding-top: 60px">
    <div class="container center-block">
        <div class="col-md-1"></div>
        <div class="col-md-10 col-sm-12">
            <h1> 读书笔记——《尽在双11》</h1>
            <hr/>
            <p>作者: 康凯森</p>
            <p>日期: 2017-08-20</p>
            <p>分类: <a href="../tag/笔记.html" target="_blank" >笔记</a></p>
            <hr/>
            <!-- toc -->
<ul>
<li><a href="#1-技术和业务的关系">1 技术和业务的关系</a></li>
<li><a href="#2-系统的发展之路">2 系统的发展之路</a></li>
<li><a href="#3-技术架构演进">3 技术架构演进</a><ul>
<li><a href="#五彩石">五彩石</a></li>
<li><a href="#异地多活">异地多活</a></li>
<li><a href="#混合云">混合云</a></li>
<li><a href="#oceanbase">OceanBase</a></li>
<li><a href="#手机淘宝">手机淘宝</a></li>
<li><a href="#蚂蚁技术架构演进">蚂蚁技术架构演进</a></li>
</ul>
</li>
<li><a href="#4-大型系统的稳定保障">4 大型系统的稳定保障</a><ul>
<li><a href="#容量规划">容量规划</a></li>
<li><a href="#全链路压测">全链路压测</a></li>
<li><a href="#全链路功能">全链路功能</a></li>
<li><a href="#自动化备战">自动化备战</a></li>
<li><a href="#实时业务审计">实时业务审计</a></li>
<li><a href="#故障演练">故障演练</a></li>
<li><a href="#系统自我保护">系统自我保护</a></li>
</ul>
</li>
<li><a href="#5-技术拓展商业边界">5 技术拓展商业边界</a></li>
</ul>
<!-- toc stop -->
<h2 id="1-技术和业务的关系">1 技术和业务的关系</h2>
<p>技术和业务的关系类似经济基础和上层建筑的关系。我们都知道经济基础决定上层建筑，上层建筑又反作用于经济基础。相应的，<strong>技术的演进是伴随解决实际业务的问题和痛点而发展和进化的</strong>，但是当一项技术足够成熟，它不仅不可以保证原有业务的稳定快速发展，而且可以产生技术红利，让其他业务直接享受这个技术的成果。</p>
<p>其中，<strong>规模和场景是驱动技术发展的关键要素</strong>。</p>
<p>首先，很多问题在业务规模很小时是不会暴露出来的，以双11为例，如果双11只有几十万，几百万用户，那么阿里压根不用进行一次有一次的架构改造，普通的技术架构足以应付；</p>
<p>以Hadoop生态圈的众多系统为例，当你搞个几台机器玩个Demo时，你会发现HDFS，MapReduce，Yarn，HBase，Spark等系统都十分稳定和高效，但是当集群达到上千，上万台机器时，当用户有千奇百怪的用法时，你会发现这些系统各种Bug层出不穷，各种性能问题，各种扩展性问题也会随之而来；</p>
<p>以我最熟悉的Kylin为例，当我们的用户很少时，查询性能溜得飞起，但是现在机器负载越来越高，用户的用法越来越多，各种性能问题也随之而来。</p>
<p>其次，就场景而言，不同的业务特点和业务需求也会带来不一样的技术挑战，还是以Kylin为例，当初精确去重就是我们业务方的强需求，我们完全是在业务的强烈需求下完成了这个技术挑战。</p>
<p>那么，<strong>技术又是如何业务发展的呢</strong>？</p>
<p>还是以OLAP系统为例，在2015年初的时候，我们公司有强烈的OLAP需求，但是我们数据平台却没有一款足够好的OLAP系统。于是我们在明确了公司主要业务线的真实需求后，对业界主流OLAP系统进行了广泛调研，最终选择了Kylin（离线）和Druid（实时），并根据我们公司真实的业务需求，对Kylin进行了大量的深度改进，如今已经在公司内部广泛使用。</p>
<p>如今，当我们已经有了足够成熟的OLAP解决方案后，当新的业务有OLAP需求时，我们就可以快速帮助他们解决问题，加速业务的发展。</p>
<h2 id="2-系统的发展之路">2 系统的发展之路</h2>
<p>在《尽在双11》这本书中，我们可以看到阿里的许多系统都是从无到有，逐渐平台化，某些最终迈向了商业化。我们来简单看下一个系统的发展基本过程和必须要解决的问题。</p>
<ol>
<li>某些业务产生了强烈的需求</li>
<li>针对特定的需求实现解决方案，改造或者研发相应的系统</li>
<li>系统逐渐高效，稳定</li>
<li>系统向全公司推广，开始平台化，让系统更加易用</li>
<li>系统的高效性和稳定性更上一层楼，开始提供SLA</li>
<li>系统足够高效，稳定，易用，开始产品化</li>
<li>系统走出公司，进行商业化。</li>
</ol>
<p>在系统的发展过程中，我们必须解决以下问题：</p>
<ol>
<li>系统的安全保障</li>
<li>系统的权限管理</li>
<li>系统的成本计算</li>
<li>系统的自动化运维</li>
<li>系统的快速故障恢复</li>
<li>系统的智能化</li>
<li>系统的云化</li>
</ol>
<h2 id="3-技术架构演进">3 技术架构演进</h2>
<h3 id="五彩石">五彩石</h3>
<ol>
<li><strong>抽取公共元素，沉淀共享服务，形成中间件</strong>。 其实就是Don&#39;t repeat yourself 原则，一个模块总有公共通用的部分，一个系统总有common模块，一个公司总有一个中间件或者技术工程部门，一个国家总有一些公共基础设施或者部门。</li>
<li>项目分三期实施。 <strong>大型项目总需要有阶段目标和成果</strong>。</li>
<li>两个大型独立系统的整合一般都涉及到<strong>数据的归一化和各种标准的统一</strong>。</li>
<li>当初阿里根据数据统计决定下线团购模式，但是之后我们都知道团购火了，阿里又上线了聚划算业务。这说明<strong>单纯依靠数据来决定业务也并不一定完全靠谱</strong>，我们还需要注重用户需求领域内模式的不断创新，包括商业的，技术的。  <strong>这也说明了一个好的想法，项目要想真正成功是需要相应的时势，环境，市场，技术，用户的</strong>。这让我想起了当年的中国首富陈天桥在20世纪初就搞的IPTV，是想要实现三网融合的一个东西，当年这个东西败就败在有点太超前了，这个东西是最近几年才真正商业化起来。这个故事有兴趣可以参考 <a href="http://business.sohu.com/20160314/n440306920.shtml">一代首富 因何退隐江湖？陈天桥死于“太创新”</a></li>
</ol>
<h3 id="异地多活">异地多活</h3>
<ol>
<li>异地多活是每个大型互联网公司发展的必经之路，用以解决规模伸缩能力和灾备能力。</li>
<li>单元化需要做到以下两点：用户流量可以随单元增加而随机分配；每个单元具备独立性。 每个单元可以认为是一个缩小规模的，包含从接入网关、应用服务到数据存储的全功能系统。每个单元具有以下特性：自包含性；松耦合性；故障独立性：一个单元的故障不会传播到其他单元；容灾性：单元之间相互备份。</li>
<li>中心节点保证一致性。</li>
<li>&quot;看到未来的能力&quot; 对于有序的架构迭代而要越来越重要。其实前瞻性和把握时代趋势的能力对于个人，企业和国家都很重要。</li>
</ol>
<h3 id="混合云">混合云</h3>
<ol>
<li>云化是解决成本问题的必经之路。</li>
<li>Docker化意味着不管在何种业务环境下，都可以简单地通过获取镜像来构建和更新整个应用环境。</li>
</ol>
<h3 id="oceanbase">OceanBase</h3>
<ol>
<li>OceanBase是2010年6月立项，至今已经7年。说明一个大型的系统要变得稳定，高效，易用，不论理论基础和架构设计多么优秀，都需要大量的人力和时间去不断优化迭代，更需要足够的业务场景进行实战检验。</li>
<li>实现一个基本可用的分布式数据库至少需要3年，然而在互联网公司，一个项目3年没有产出基本意味着终结。所以我们在进行大型项目时，一定要小布快跑，多轮迭代，一开始着眼于核心部分，在稳定，高效，易用中应该更偏向于高效和稳定，并且在一开始对某些难度较高的部分进行简化，加速进度。</li>
<li>OceanBase通过分布式选举协议来解决强一致性问题，其实这也是业界的普遍解法。</li>
<li>OceanBase的分区副本通过Paxos选举协议来进行日志同步，跨分区事务通过两阶段提交协议实现，这也是业界的常见解法。</li>
</ol>
<h3 id="手机淘宝">手机淘宝</h3>
<ol>
<li>异步调用和延迟加载是常用的性能优化手段。</li>
<li>用热补丁的方式修复线上问题。</li>
<li>容器化（web中的容器），组件化，插件化。</li>
</ol>
<h3 id="蚂蚁技术架构演进">蚂蚁技术架构演进</h3>
<ol>
<li>金融系统的关键目标：高可用：4个9以上；安全；性能；成本：灵活的资源调度与按需伸缩能力是降低成本的关键；资金安全；数据质量。</li>
</ol>
<h2 id="4-大型系统的稳定保障">4 大型系统的稳定保障</h2>
<h3 id="容量规划">容量规划</h3>
<ol>
<li><p>阿里容量规划发展的4个阶段：</p>
<ol>
<li>人工估算</li>
<li>线下性能压测估算</li>
<li>线上压测估算</li>
<li>全链路压测估算</li>
</ol>
</li>
<li><p>估算公式： 预估业务量级 / 单机能力 = 最小机器数。 采购机器数 = 最小机器数 + Buffer。预估业务量级通过BI分析+预测算法可以拿到比较准确的值；单机能力的获取主要是通过线下的性能测试。</p>
</li>
<li>线上压测评估容量：将单机能力获取直接搬到线上。 对整个压测流程进行精准的控制和实时的监控，对异常情况进行完备的容灾。历经线上模拟压力测试，线上流量复制压力测试，线上引流压力测试（把分布式的流量比较集中地调用到某一台机器上）3个阶段。</li>
<li>全链路压测彻底解决容量规划问题。</li>
<li><strong>容量规划的本质是资源管理</strong>。</li>
</ol>
<h3 id="全链路压测">全链路压测</h3>
<p>全链路压测的目的是通过模拟双11的系统压力来发现问题，全方位校验业务的稳定性。全链路压测主要包含以下部分：</p>
<ol>
<li>业务改造升级支持全链路压测。</li>
<li>数据构造：足够量级的数据和正确的数据模型。</li>
<li>数据隔离：在所有写数据的地方对压测流量进行识别，如果是压测流量的写，就写到隔离的位置，包括存储、缓存、搜索引擎等。</li>
<li>平台化：压测能力开放，让业务方可以自主压测。</li>
<li>日常化：让压测可以在白天进行。</li>
</ol>
<h3 id="全链路功能">全链路功能</h3>
<p>全链路功能的目的是模拟双11当天的用户行为，来保证系统的功能和表现符合预期。全链路功能的架构和技术包括以下部分：</p>
<ol>
<li>数据同步系统：全链路功能使用的影子数据必须和线上一一对应。</li>
<li>模型系统：抽象出买家和商品两个主要维度，基于数据特征向量表分别过滤商品和用户，然后随机组合下单。</li>
<li>隔离系统：流量隔离； 时间控制：直接改JDK。</li>
<li>构造执行系统。</li>
<li>分析系统：错误码分析；审计分析；Response分析。</li>
</ol>
<h3 id="自动化备战">自动化备战</h3>
<p>可以自动化的就不要人工来搞。包括以下部分：</p>
<ol>
<li>流量和容量评估</li>
<li>全链路压测系统</li>
<li>全局资源调度系统</li>
<li>弹性伸缩</li>
<li>预案平台：突发情况出现时如何应对</li>
<li>流量调度</li>
</ol>
<h3 id="实时业务审计">实时业务审计</h3>
<p>实时监测线上系统产生的数据是否正确。</p>
<h3 id="故障演练">故障演练</h3>
<p><strong>任何技术设施、系统、人、流程都可能出问题。减少故障的最好方式就是让故障在可控的前提下经常性地复现。故障演练的目的就是以场景话的方式沉淀，以可控成本在线上模拟故障。</strong></p>
<p>强弱依赖治理：依赖模型包括关系、流量、强弱等因素。合理且清晰的依赖关系数据可以被利用到系统调用优化、故障根源查找、系统降级、依赖容量、依赖告警、代码影响范围、系统发布顺序等诸多场景。</p>
<p>故障的理解：</p>
<ol>
<li>问题：<strong>凡是不符合预期的表现都可以称为问题，问题不等于故障。</strong></li>
<li>故障：<strong>只有带来一定业务影响、满足一定标准的问题才会被称之为故障</strong>。</li>
<li>故障的发生是独特的：没有两个完全相同的故障。</li>
<li>故障是可以被抽象的：<strong>任何一个故障的发生原因都是确定的，可以被归纳到一种或者几种故障组合</strong>。</li>
</ol>
<h3 id="系统自我保护">系统自我保护</h3>
<p>系统自我保护是稳定性的最后一道屏障，主要包含以下部分：<strong>限流、自动降级、流量调度、负载保护和预案。</strong></p>
<ol>
<li>限流：令牌桶算法。</li>
<li>自动降级：&quot;弃车保帅&quot;。</li>
<li>流量调度：根据机器的实时服务能力来分配机器的实时流量。</li>
<li>负载保护。</li>
<li>预案。</li>
</ol>
<h2 id="5-技术拓展商业边界">5 技术拓展商业边界</h2>
<ol>
<li><strong>数据化、算法、产品构成了智能商业的3个基石</strong>。更重要的是要形成一个反馈闭环： 数据既是高速流动的介质，又持续增值，算法既是推动反馈闭环运转的引擎，又持续优化，产品既是反馈闭环的载体，又持续改进功能。</li>
<li>把商家竞争意识、消费者行为、平台意志结合到一起，打造成一个生态闭环。</li>
</ol>

            <hr/>
            <div style="padding: 0; margin: 10px auto; width: 90%; text-align: center">
                <button id="rewardButton" , disable="enable" ,
                        onclick="var qr = document.getElementById('QR'); if (qr.style.display === 'none') {qr.style.display='block';} else {qr.style.display='none'}"
                        ,
                        style="cursor: pointer; border: 0; outline: 0; border-radius: 100%; padding: 0; margin: 0; letter-spacing: normal; text-transform: none; text-indent: 0px; text-shadow: none">
                    <span style="display: inline-block; width: 60px; height: 60px; border-radius: 100%; line-height: 58px; color: #fff; font-size:36px; font-family: 'Palatino Linotype', 'Book Antiqua', Palatino, Helvetica, STKaiti, SimSun, serif; background: rgb(236,96,0)">赞</span>
                </button>
                <div id="QR" style="display: none;">
                    <p><img src="../images/weixin.jpeg" width="200" /></p>
                    <p><img src="../images/zhifubao.jpeg" width="200" /></p>
                </div>

            </div>
            <h3>评论</h3>
            <div id="vcomment"></div>
        </div>
        <div class="col-md-1"></div>
    </div>
</div>

<div class="row" style="padding-top: 60px">
    <div class="container center-block">
        <div class="col-md-1"></div>
        <div class="col-md-10 col-sm-12">
            <div class="ds-thread"
                 data-thread-key=59995a617552e30b033b6f64
                 data-title=读书笔记——《尽在双11》
                 data-url=ali11>
            </div>
        </div>
        <div class="col-md-1"></div>
    </div>
</div>

<div class="footer">
    <a href="https://www.bcmeng.com/" target="_blank"  rel="nofollow">康凯森</a>
</div>

<script src="../js/code.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
<script src="../js/jquery.min.js"></script>
<script src="../js/bootstrap.js"></script>
<script>
    var _hmt = _hmt || [];
    (function() {
        var hm = document.createElement("script");
        hm.src = "https://hm.baidu.com/hm.js?1d198a377ef466190881d1c021155925";
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(hm, s);
    })();
</script>
<script src="../js/av-min.js"></script>
<script src='../js/Valine.min.js'></script>
<script type="text/javascript">
    window.valine = new Valine({
        el: '#vcomment' ,
        verify: true,
        notify: true,
        appId: 'BlLnB0re5OzQVzrgEplAxkyg-gzGzoHsz',
        appKey: 'wUyxSV0U4Vi7oK1EHK6ipErv',
        placeholder: '欢迎评论'
    });
</script>

</body>
</html>